今天要來談動態類神經網路,什麼叫做動態類神經網路呢?也就是說在你的類神經網路訓練過程中,類神經網路的架構會做動態的調整,舉例來說,如果你建立了一個 RBFNN 那麼你可能會挑選 20 個中心點,20 個中心點在訓練過程中可能會做調整,你會覺得很奇怪,他要怎麼調整呢?
一個最簡單的方法就是,你的模型複雜度越高他對未來的適應性就更低,因為可能會過度地匹配你的訓練樣本,因此你可以把類神經網路中代表模型複雜度的項,作為配適函數中的負項。
舉例來說,我可能會把目標函數設定為:
由於你採用啟發式演算法來更新權重,所以這邊的 neural number 原則上也是要做調整,但是你可能沒有好的調整方式,或是在啟發式搜尋中可能不容易去搜尋,因此我在此推薦大家若要用啟發式演算法來做動態類神經網路,你最好的方法就是你每一回合會隨機增減你的模型複雜度,讓他對你的 Fitness 做干擾,但是不要去優化他。
什麼意思呢?也就是說你可以設定你的最低和最高的模型複雜度,舉例來說就是 RBFNN 的中心點個數(或隱藏層神經元)最低你可以先設定 5 最高設定 100 ,然後每回合你會有 0.2 和 0.2 的機率上調或降低你的模型複雜度,透過 rand() 函數來做,然後保留多一點的機率在維持現在的模型複雜度,因為你每回合優化的過程中你需要多參考多一點同樣模型複雜度的來做取捨,當然你可能下一回合你的模型複雜度提升,例如中心點個數提升到 30 個,那這時候你的 fitness 就會減比較多,但是你也會有比較高的機會訓練出更好的模型。
很多人會問的是說,如果是動態類神經網路的話,每回合訓練過程模型複雜度會變來變去,那我要每回合模型複雜度提升的時候在初始化一些,然後模型複雜度降低的時候再把它刪除嗎?這裡就要參考 Dropout 的概念,簡單來說,你應該初始化的時候就要初始化到最大模型複雜度,但是你會先從一個比較小的模型複雜度開始做,但是你還是會帶著整個大模型做訓練,只是你在程式碼的部分就要忽略或跳過些部分,也就是說那些部分好像是被冷凍(freeze)起來一樣。
舉例來說,如果你隱藏層神經元最高要設定 400 個,那麼你開始可能只用 20 個,但是你隱藏層神經元還是維度有 400 ,但是你有一個參數控制你可以使用前 20 個神經元做計算,而當模型複雜度提升的時候,你要參與模型計算的隱藏層神經元就會被多,而模型複雜度降低的時候,神經元素就變少,但是權重就停留在當初他有被使用到的那個情況。
舉例來說 RBFNN 假如最高設定 400 個中心點,初始使用 20 個中心點,每回合增加減少中心點 1 個的機率分別是 0.2 而不動的機率是 0.6 ,假如這回合我要降低模型複雜度到 19 個中心點,那原本第 20 個的中心點就會好像是被凍結一樣,雖然他有參與前面的訓練,但是他暫時不會再做改變了。
同樣道理,如果你做深度學習你也可以把你的很多層類神經網路的分支去做隨機凍結,只是在啟發式演算法的使用上他比較詭異,因為你可以把它當作模型目標函數的一項來優化,至於他在優化中要占比是多少?(例如上圖是用 0.01 )你就要根據你的問題來嘗試找出合理的比例,讓他參與到目標函數之中。
動態類神經網路最重要的概念就是,模型複雜度有時候放到啟發式演算法裡面搜尋不一定會比較好,你可以透過隨機改變的方式,來對目標函數做一點干擾,同時你也可以觀察是不是你的模型複雜度和匹配程度存在一個黃金交叉點,也就是說當我模型複雜度提升到一個情況之後,目標函數值就上不去開始抵減了。
我的經驗是你大概會找出一個區間範圍是比較合理的,這也取決於你放入的資料維度與訓練資料的大小,因此得多加嘗試才能找出好的答案。
又一篇廢文了,希望還是能對某些人有幫助。